package com.aterrizar.asiento;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.SortedSet;
import java.util.TreeSet;

import org.uqbar.commons.model.Entity;
import org.uqbar.commons.model.UserException;
import org.uqbar.commons.utils.TransactionalAndObservable;

import com.aterrizar.aerolinea.Aerolinea;
import com.aterrizar.reserva.Reserva;
import com.aterrizar.sistema.Aterrizar;
import com.aterrizar.usuario.Usuario;

@TransactionalAndObservable
public class Asiento extends Entity implements Comparable<Asiento> {

	private static final long serialVersionUID = -7162224198572672796L;

	private String codigo; // Vuelo-NumeroDeAsiento
	private BigDecimal precio;
	private String clase;
	private String ubicacion;
	private String fechaSalida;
	private String fechaLlegada;
	private String horaSalida;
	private String horaLlegada;
	private String origen;
	private String destino;
	private Aerolinea aerolinea;
	private Usuario pasajero;
	private SortedSet<Reserva> reservas;

	public Asiento() {
	}

	public Asiento(String codigo, BigDecimal precio, String clase,
			String ubicacion, String fechaSalida, String fechaLlegada,
			String horaSalida, String horaLlegada, String origen,
			String destino, Aerolinea aerolinea) {
		setCodigo(codigo);
		setPrecio(precio);
		setClase(clase);
		setUbicacion(ubicacion);
		setFechaSalida(fechaSalida);
		setFechaLlegada(fechaLlegada);
		setHoraSalida(horaSalida);
		setHoraLlegada(horaLlegada);
		setOrigen(origen);
		setDestino(destino);
		setAerolinea(aerolinea);
		reservas = new TreeSet<Reserva>();
	}

	public BigDecimal getPrecio() {
		return precio;
	}

	public void setPrecio(BigDecimal precio2) {
		this.precio = precio2;
	}

	public String getUbicacion() {
		return ubicacion;
	}

	public void setUbicacion(String ubicacion) {
		this.ubicacion = ubicacion;
	}

	public String getClase() {
		return clase;
	}

	public void setClase(String clase) {
		this.clase = clase;
	}

	public String getCodigo() {
		return codigo;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	public Aerolinea getAerolinea() {
		return aerolinea;
	}

	public void setAerolinea(Aerolinea aerolinea) {
		this.aerolinea = aerolinea;
	}

	public SortedSet<Reserva> getReservas() {
		return reservas;
	}

	public void setReservas(SortedSet<Reserva> reservas) {
		this.reservas = reservas;
	}

	public boolean isReservado() {
		return !reservas.isEmpty();
	}

	public String getNombreAerolinea() {
		return getAerolinea().getNombre();
	}

	public boolean isSuperOferta() {
		return ((this.getClase().equals("P") && this.getPrecio().compareTo(
				new BigDecimal(8000)) < 0) || (this.getClase().equals("E") && this
				.getPrecio().compareTo(new BigDecimal(4000)) < 0));
	}

	@Override
	public int compareTo(Asiento asiento) {

		String codigoThis = this.getCodigo();
		String codigoOtro = asiento.getCodigo();

		return codigoThis.compareTo(codigoOtro);

	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((codigo == null) ? 0 : codigo.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Asiento other = (Asiento) obj;
		if (codigo == null) {
			if (other.codigo != null)
				return false;
		} else if (!codigo.equals(other.codigo))
			return false;
		return true;
	}

	public String getHoraLlegada() {
		return horaLlegada;
	}

	public void setHoraLlegada(String horaLlegada) {
		this.horaLlegada = horaLlegada;
	}

	public String getHoraSalida() {
		return horaSalida;
	}

	public void setHoraSalida(String horaSalida) {
		this.horaSalida = horaSalida;
	}

	public String getOrigen() {
		return origen;
	}

	public void setOrigen(String origen) {
		this.origen = origen;
	}

	public String getDestino() {
		return destino;
	}

	public void setDestino(String destino) {
		this.destino = destino;
	}

	public String getFechaSalida() {
		return fechaSalida;
	}

	public void setFechaSalida(String fechaSalida) {
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		try {
			sdf.parse(fechaSalida);
		} catch (ParseException e) {
			throw new UserException(
					"La fecha debe respetar el formato DD/MM/AAAA");
		}
		this.fechaSalida = fechaSalida;
	}

	public String getFechaLlegada() {
		return fechaLlegada;
	}

	public void setFechaLlegada(String fechaLlegada) {
		this.fechaLlegada = fechaLlegada;
	}

	public String getDniPasajero() {
		return pasajero.getDni();
	}

	public void setDniPasajero(String dniPasajero) {
		pasajero.setDni(dniPasajero);
	}

	public String getVuelo() {
		return codigo.split("-")[0];
	}

	public String getAsiento() {
		return codigo.split("-")[1];
	}

	public void agregarReserva(Usuario usuario) {
		if (reservas.isEmpty())
			Aterrizar.getInstance().getAsientosReservados().add(this);
		getReservas().add(new Reserva(usuario.getDni()));
	}

	public void traspasarReserva() {
		Reserva vencida = reservas.first();
		this.reservas.remove(vencida);
		if (reservas.isEmpty())
			Aterrizar.getInstance().getAsientosReservados().remove(this);
	}

	public Usuario getPasajero() {
		return pasajero;
	}

	public void setPasajero(Usuario pasajero) {
		this.pasajero = pasajero;
	}

	public void sobreReservar(Usuario usuario) {
		
	}

}